#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
日志系统使用示例
展示如何记录用户操作和系统接收资料
"""

import sys
import os
from datetime import datetime

# 添加项目根目录到Python路径
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.insert(0, project_root)

try:
    from src.utils.logger_manager import (
        SystemLoggerManager, get_system_logger, set_system_logger,
        OperationType, LogLevel
    )
    from src.utils.log_decorators import (
        log_user_operation, log_data_reception, log_system_event,
        log_login, log_sample_operation, log_data_receive_sample
    )
    from src.core.database_manager import DatabaseManager
    from src.models.models import OperationLog
except ImportError as e:
    print(f"导入模块失败: {e}")
    sys.exit(1)

def example_user_operations():
    """示例：用户操作日志记录"""
    print("\n=== 用户操作日志记录示例 ===")
    
    # 获取系统日志管理器
    system_logger = get_system_logger()
    
    # 设置当前用户
    system_logger.set_current_user("admin")
    
    # 记录各种用户操作
    system_logger.log_user_operation(
        OperationType.USER_LOGIN.value,
        "用户登录系统",
        details={"login_time": datetime.now().isoformat()}
    )
    
    system_logger.log_user_operation(
        OperationType.SAMPLE_ADD.value,
        "添加样本 2024001",
        details={"sample_id": "2024001", "patient_name": "张三"}
    )
    
    system_logger.log_user_operation(
        OperationType.SAMPLE_QUERY.value,
        "查询样本列表",
        details={"query_conditions": "所有样本", "result_count": 150}
    )
    
    system_logger.log_user_operation(
        OperationType.SYSTEM_CONFIG_UPDATE.value,
        "更新系统配置",
        details={"config_item": "通信设置", "new_value": "COM3"}
    )

def example_data_reception():
    """示例：数据接收日志记录"""
    print("\n=== 数据接收日志记录示例 ===")
    
    system_logger = get_system_logger()
    
    # 记录样本数据接收
    system_logger.log_data_reception(
        "样本数据",
        "样本ID: 2024001, 患者: 张三",
        source="设备 COM3",
        raw_data="<TRANSMIT>样本数据内容</TRANSMIT>",
        details={
            "sample_id": "2024001",
            "data_size": 1024,
            "protocol": "CUSTOM_LIS"
        }
    )
    
    # 记录检测结果接收
    system_logger.log_data_reception(
        "检测结果",
        "HbA1c: 6.5%, 血糖: 5.2mmol/L",
        source="设备 COM3",
        details={
            "sample_id": "2024001",
            "test_count": 2,
            "protocol": "CUSTOM_LIS"
        }
    )
    
    # 记录图片数据接收
    system_logger.log_data_reception(
        "图片数据",
        "样本图片 2024001.jpg",
        source="设备 COM3",
        details={
            "sample_id": "2024001",
            "image_size": 2048000,
            "image_format": "JPEG"
        }
    )

def example_system_events():
    """示例：系统事件日志记录"""
    print("\n=== 系统事件日志记录示例 ===")
    
    system_logger = get_system_logger()
    
    # 记录系统启动
    system_logger.log_system_event(
        "系统启动",
        "LIS系统已启动",
        details={"version": "1.0.0", "startup_time": datetime.now().isoformat()}
    )
    
    # 记录通信连接
    system_logger.log_communication_event(
        "建立连接",
        "串口连接成功",
        connection_info={"port": "COM3", "baudrate": 115200},
        success=True
    )
    
    # 记录系统错误
    system_logger.log_system_event(
        "系统错误",
        "数据库连接失败",
        log_level=LogLevel.ERROR,
        details={"error_code": "DB001", "error_message": "连接超时"}
    )

def example_decorator_usage():
    """示例：使用装饰器记录日志"""
    print("\n=== 装饰器使用示例 ===")
    
    @log_login
    def user_login(username, password):
        """用户登录函数"""
        print(f"用户 {username} 登录中...")
        # 模拟登录逻辑
        return True
    
    @log_sample_operation("添加")
    def add_sample(sample_id, patient_name):
        """添加样本函数"""
        print(f"添加样本 {sample_id}, 患者: {patient_name}")
        # 模拟添加样本逻辑
        return True
    
    @log_data_receive_sample
    def receive_sample_data(data):
        """接收样本数据函数"""
        print(f"接收样本数据: {data[:50]}...")
        # 模拟数据处理逻辑
        return True
    
    # 执行带日志记录的函数
    user_login("admin", "password123")
    add_sample("2024002", "李四")
    receive_sample_data("样本数据内容...")

def example_log_retrieval():
    """示例：日志查询和显示"""
    print("\n=== 日志查询示例 ===")
    
    system_logger = get_system_logger()
    
    # 获取所有日志
    all_logs = system_logger.get_logs()
    print(f"总日志数量: {len(all_logs)}")
    
    # 获取最近的10条日志
    recent_logs = system_logger.get_logs({"limit": 10})
    print(f"最近10条日志:")
    for i, log in enumerate(recent_logs, 1):
        print(f"{i}. [{log.operation_time}] {log.operator} - {log.operation_type}: {log.operation_content}")

def main():
    """主函数"""
    print("LIS系统日志记录示例")
    print("=" * 50)
    
    # 初始化数据库管理器
    db_manager = DatabaseManager()
    
    # 初始化系统日志管理器
    system_logger = SystemLoggerManager(db_manager)
    set_system_logger(system_logger)
    
    try:
        # 运行各种示例
        example_user_operations()
        example_data_reception()
        example_system_events()
        example_decorator_usage()
        example_log_retrieval()
        
        print("\n=== 示例完成 ===")
        print("所有日志已记录到数据库和文件中")
        print("可以查看数据库中的 operation_logs 表")
        print("也可以查看当前目录下的 system.log 文件")
        
    except Exception as e:
        print(f"示例执行失败: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    main() 